package Z.dailyExercise._1215;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Stack;

public class _7_整数反转 {
    /**
     * 7. 整数反转---自解：用栈的形式 但是会有溢出的情况
     * @param x
     * @return
     */
    Stack<Integer> stack = new Stack<>();
    public int reverse(int x) {

        if (x/10 ==0){
            return x;
        }
        if (Math.abs(x) >(int) Math.pow(2,31)){
            return 0;
        }

        ArrayList<Integer> list = new ArrayList<>();

        putStack(Math.abs(x));


        while (stack.peek() == 0){
            stack.pop();
        }

        while (!stack.isEmpty()){
            list.add(stack.pop());
        }

        int re = 0;
        for (int i=0;i<list.size();i++){
            re = re + list.get(i)*(int)Math.pow(10,list.size()-i-1);
        }

        if (x<0){
            return 0-re;
        }else {
            return re;
        }



    }
    public void putStack(int n){

        if (n>9){
            putStack(n/10);
        }
        stack.push(n%10);
    }

    /**
     * 没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字，我们可以使用数学方法
     * max 2147483647
     * min -2147483648


     * 做溢出检查 借助数学不等式远离
     * 结果返回的int rev = rev * 10 + pop; 其中pop是从原数字
     */

    public int reverse1(int x) {

        int re =0;
        while (x != 0){
            int pop = x%10;
            x /= 10;

            //正数
            if (re > Integer.MAX_VALUE/10 || (re == Integer.MAX_VALUE/10 && pop>7)){
                return  0;
            }
            //负数
            if (re < Integer.MIN_VALUE/10 || (re == Integer.MIN_VALUE/10 && pop<-8)){
                return  0;
            }

            re = re*10+pop;
        }

        return re;

    }




}
